/* Abstract class used to give all states the same basic functions.
 * Includes finite state machine functions
 */
#pragma once

#define SEEK			0
#define PURSUIT			1
#define ARRIVE			2
#define INTERPOSE		3
#define OFFSETPURSUIT	4
#define FLEE			5
#define EVADE			6
#define	HIDE			7
#define	WALLAVOID		8
#define	PATHFOLLOWING	9
#define	WANDER			10
#define	SEPERATION		11
#define	ALIGNMENT		12
#define COHESION		13
#define	FLOCKING		14
#define PAUSE			15
#define SEEKEVADE		16

#include "GameStd.h"
#include <SdkCameraMan.h>

class State : public IGameManager, public IInputListener {
	friend class GameEngine;
public:

	virtual void Enter(int prevState)=0;
	virtual void Pause()=0;
	virtual void Unpause()=0;
	virtual void Execute()=0;
	virtual void Exit()=0;
	virtual bool IsRunning()=0;

	void OnKeyDown(const OIS::KeyCode& key)=0;
	void OnKeyUp(const OIS::KeyCode& key)=0;
	void OnKeyHeld(const OIS::KeyCode& key)=0;

	void OnMouseDown(const OIS::MouseState& mouse, const OIS::MouseButtonID &id)=0;
	void OnMouseUp(const OIS::MouseState& mouse, const OIS::MouseButtonID &id)=0;
	void OnMouseHeld(const OIS::MouseState& mouse, const OIS::MouseButtonID &id)=0;
	void OnMouseMoved(const OIS::MouseState& mouse)=0;

	void Initialize()=0;
	void UpdateStarted(const Ogre::FrameEvent& gameTime)=0;
	void UpdateEnded(const Ogre::FrameEvent& gameTime)=0;
	void Cleanup()=0;

protected:

	virtual void createScene()=0;

	OgreBites::SdkCameraMan* mCameraMan;
	
};